import { Service } from 'egg';
const { Op } = require('sequelize');

export default class Users extends Service {
  // 查找单个用户信息
  public async getOneUsers(id) {
    const data = await this.ctx.model.User.findOne({
      where: { id },
      // 不返回这些属性
      attributes: {
        exclude: [ 'password', 'createdAt', 'updatedAt' ],
      },
    });
    // 去除密码
    // const userData = data!.dataValues;
    // delete userData.password;
    // return userData;
    return data;
  }
  // 查找全部用户信息
  public async getUsers() {
    return await this.ctx.model.User.findAll({
      // 不返回这些属性
      attributes: {
        exclude: [ 'password', 'createdAt', 'updatedAt' ],
      },
    });
  }
  // 根据条件获取用户信息(分页)
  public async getUserList(obj) {
    const currentPage = parseInt(obj.currentPage) || 1;
    const pageSize = parseInt(obj.pageSize) || 5;
    const { key, role, origin, type } = obj;
    // 关键字的查询条件
    const defaultCondtion = {
      [Op.or]: [
        { username: { [Op.substring]: key } }, // LIKE '%key%'
        { email: { [Op.substring]: key } },
        { phone: { [Op.substring]: key } },
      ],
    };
    // 如果筛选条件都有则进行判断
    if (key || role || origin || type) {
      // 收集筛选逻辑
      const conditionList:any[] = [];
      if (key) {
        conditionList.push(defaultCondtion);
      }
      // if(role){}
      if (origin) {
        // 所有来源的筛选条件
        // { local:true } || { github:true }
        conditionList.push({ [origin]: true });
      }
      if (type) {
        // 所有用户的筛选条件
        // { username:{[Op.substring]:关键字} } { email:{[Op.substring]:关键字} } { phone:{[Op.substring]:关键字} }
        conditionList.push({ [type]: { [Op.substring]: key } });
      }
      const users = await this.ctx.model.User.findAll({
        attributes: {
          exclude: [ 'password', 'createdAt', 'updatedAt' ],
        },
        where: {
          [Op.and]: conditionList,
        },
        limit: pageSize, // 取多少条数据
        offset: (currentPage - 1) * pageSize, // 0-5 6-10 跳过 offset 条 取 limit 条
      });
      const count = await this.ctx.model.User.findAndCountAll({
        where: {
          [Op.and]: conditionList,
        },
      });
      return { users, count: count.count };
    }
    const users = await this.ctx.model.User.findAll({
      // 不返回这些属性
      attributes: {
        exclude: [ 'password', 'createdAt', 'updatedAt' ],
      },
      limit: pageSize, // 取多少条数据
      offset: (currentPage - 1) * pageSize, // 0-5 6-10 跳过 offset 条 取 limit 条
    });
    // 记录总数
    const count = await this.ctx.model.User.findAndCountAll();
    return { users, count: count.count };

  }
  // 新增用户
  public async createUsers(obj) {
    const { username, email, phone, password } = obj;
    // 先把密码加密
    obj.password = this.ctx.helper.encryptText(password);
    // 查询有没有当前用户
    let user;
    if (username) {
      user = await this.ctx.model.User.findOne({ where: { username } });
      if (user) {
        throw new Error('用户名已存在');
      }
    }
    if (email) {
      user = await this.ctx.model.User.findOne({ where: { email } });
      if (user) {
        throw new Error('邮箱已存在');
      }
    }
    if (phone) {
      user = await this.ctx.model.User.findOne({ where: { phone } });
      if (user) {
        throw new Error('电话已存在');
      }
    }
    // 加入数据库中
    const data = await this.ctx.model.User.create(obj);
    // 去除密码
    const userData = data.dataValues;
    delete userData.password;
    return userData;
  }
  // 删除用户
  public async destroyUsers(id) {
    // findByPk方法使用提供的主键从表中仅获得一行数据
    const user = await this.ctx.model.User.findByPk(id);
    if (user) {
      // 查到用户就根据 id 删除
      const data = await this.ctx.model.User.destroy({
        where: { id },
      });
      // 当返回的data > 0则代表删除成功
      if (data > 0) {
        return user;
      }
      throw new Error('要删除的用户不存在');
    }
  }
  // 编辑用户
  public async updateUsers(id, obj) {
    const { password } = obj;
    // 密码加密
    obj.password = this.ctx.helper.encryptText(password);
    // findByPk方法使用提供的主键从表中仅获得一行数据
    const user = await this.ctx.model.User.findByPk(id);
    if (user) {
      // 没有值则删除掉防止空值覆盖了原本的值
      // obj.username ? '' : delete obj.username;
      // obj.password ? '' : delete obj.password;
      // obj.email ? '' : delete obj.email;
      // obj.phone ? '' : delete obj.phone;
      // 查到有则根据id修改这个用户信息
      const data = await this.ctx.model.User.update(obj, {
        where: {
          id,
        },
      });
      if (data.length > 0) {
        return data;
      }
      throw new Error('更新用户信息失败');
    } else {
      throw new Error('更新用户不存在');
    }
  }
}
